package com.edu.juc.threadLocal.reference;

import com.edu.juc.threadLocal.bean.MyObject;

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.concurrent.TimeUnit;

/**
 * 当内存不足，JVM开始垃圾回收，
 * 对于强引用对象，就算是出现了OOM也不会对该对象进行回收。
 * <p>
 * 即使该对象以后永远用不到，JVM也不会回收。
 * 因此强引用是造成Java内存泄漏的主要原因之一。
 */
public class ReferenceTest {
    public static void main(String[] args) {
        MyObject myObject = new MyObject();
        System.out.println("gc before: " + myObject);
        myObject = null;
        System.gc();
        System.out.println("gc after: " + myObject);
    }

    /**
     * 软引用
     * 软引用：内存不足时，JVM会回收
     */
    public static class SoftReferenceTest {
        public static void main(String[] args) throws InterruptedException {
            SoftReference<MyObject> softReference = new SoftReference<>(new MyObject());
            System.gc();

            TimeUnit.SECONDS.sleep(1);
            System.out.println(softReference.get());

        }
    }

    /**
     * 弱引用
     * 弱引用，会被垃圾回收器回收
     */
    public static class WeakReferenceTest {
        public static void main(String[] args) {
            WeakReference<MyObject> reference = new WeakReference<>(new MyObject());
            System.out.println(reference.get());
            System.gc();
            System.out.println(reference.get());
        }
    }
}
